//
//  TLUserAccountViewModel.swift
//  TLSinaWeiBo
//
//  Created by 谭亮 on 16/5/21.
//  Copyright © 2016年 tanliang. All rights reserved.
//

import UIKit

class TLUserAccountViewModel: NSObject {

    // 单例
    static let sharesInstance: TLUserAccountViewModel = TLUserAccountViewModel()
    
    // 账号归档和解档的路径
    let userAccountPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! + "/account.plist"
    
    // 账号,全局只要拿到单例就可以访问
    var userAccount: TLUserAccount?
    
    override init() {
        super.init()
        
        //单例创建的时候就会加载沙盒里面的账号,赋值给userAccount,只需要加载一次
        userAccount = loadUserAccount()
    }
    
    /// ->发送POST请求获取AccessToken
    func loadAccessToken(code: String, callback: (error: NSError?) -> ()) {

        //->如果urlString里面开头是http或https就直接使用这个urlString，如果不是，AFN会帮我们拼接baseURL
        let urlString = "oauth2/access_token"
        //:->参数
        let psrameters = [
            "client_id": client_id,
            "client_secret":client_secret,
            "grant_type":"authorization_code",
            "code":code,
            "redirect_uri":redirect_uri
        ]
        //:->如果已经授权成功了，下次在授权的时候不会再看到这个界面，相当于新浪会自动帮我们点击授权按钮
        //如果还想自己来授权，需要去网站上取消授权
        TLNetworkTool.sharedInstance.request(RequestMethod.POST, URLString: urlString, parameters: psrameters, success: { (task, responseObject) -> Void in
            TLPrint(items: "获取AccessToken成功: \(responseObject)")
            
            // 判断返回的数据是否可以转成字典
            if let result = responseObject as? [String: AnyObject] {
                // 字典转模型
                let userAccount = TLUserAccount(dict: result)
                TLPrint(items: "userAccount: \(userAccount)")
                
                TLPrint(items: "userAccountPath: \(self.userAccountPath)")
                // 调用归档的方法,将模型归档到沙盒里面
                // 让userAccount对象保存到self.userAccountPath这个路径
                NSKeyedArchiver.archiveRootObject(userAccount, toFile: self.userAccountPath)
                
                // 将账号赋值给属性
                self.userAccount = userAccount
                
                // 告诉控制器.模型保存完成了
                callback(error: nil)
            } else {
                TLPrint(items: "返回数据转字典失败了")
            }
            
            
            }, failure: { (task, error) -> Void in
                //TLPrint(items: "失败了: \(error)")
                callback(error: error)
        })
    }
    
    // 解档账号
    func loadUserAccount() -> TLUserAccount? {
        // 解档对象
        // 从self.userAccountPath文件里面加载账号
        if let userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(self.userAccountPath) as? TLUserAccount {
            //加载了账号,判断是否过期
            // userAccount.expiresDate 和当前时间比较
            // NSDate():当前时间
            // userAccount.expiresDate < NSDate() 过期的 NSComparisonResult.OrderedDescending
            // 测试:1.改系统时间 2.改userAccount.expiresDate属性,早期的时间
            //userAccount.expiresDate = NSDate(timeIntervalSinceNow: -1000)
            if userAccount.expiresDate?.compare(NSDate()) != NSComparisonResult.OrderedDescending {
                //没有过期
                TLPrint(items: "没有过期")
                return userAccount
            } else {
                return nil
            }
            
            return userAccount
        } else {
            //没有加载出账号
            
            return nil
        }
    }
}
